/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */
package cz.pecinovsky.english.pojj.adv_demo.empty_classes;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;

import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;

import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfScenario;
import cz.pecinovsky.english.pojj.adv_framework.scenario.ScenarioStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;

import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_101;
import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_115;


import static  cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfStep.*;



/*******************************************************************************
 * Instance třída {@code PrázdnýSprávceScénářůLit} slouží jako správce scénářů,
 * které mají prověřit a/nebo demonstrovat správnou funkci plánované hry.
 * Jednotlive scénáře jsou iterovatelné posloupností kroků specifikovaných
 * instancemi třídy <code>ScenarioStep</code> z rámce, do nějž se hra začleňuje.
 * <p>
 * Správce scénářů je jedináček, který má na starosti všechny scénáře
 * týkající se s ním sdružené hry.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 3.00,  22.11.2006
 */
public class PrázdnýSprávceScénářůLit extends AScenarioManager
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Třída, jejíž instance jsou zde spravovány. */
    private final static Class<? extends IGame> TŘÍDA = null;

    /** Jmeno autora dane tridy. */
    private static final String autor = "PECINOVSKÝ Rudolf";

    /** X-name autora/autorky třídy. */
    private static final String xname = "XPECR999";


    /***************************************************************************
     * Konstruktor plnohodnotné instance třídy {@link ScenarioStep}
     * vyžaduje následující parametry:
     *      String   příkaz;    //Příkaz realizující tetno krok scénáře
     *      String   zpráva;    //Zpráva vypsaná po zadání příkazu
     *      String   prostor;   //Prostor, v něž skončí hráč po zadání příkazu
     *      String[] východy;   //Aktuální východy z aktuálního prostoru
     *      String[] objekty;   //Objekty vyskytující se v daném prostoru
     *      String[] batoh;     //Aktuální obsah batohu
     *      TypeOfStep typTestu;  //Typ daného kroku testu
     */


    /***************************************************************************
     * Základní scénář popisující možný úspěšný průběh hry.
     */
    private static final ScenarioStep[] základní =
    {
        new ScenarioStep( "", //Název prvního příkazu musí být prázdný řetězec
            "Uvítání",
            "VýchozíProstor",
            new String[] { "Sousedé" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsSTART ),

        new ScenarioStep( "příkaz",
            "Zpráva_vypsaná_v_reakci_na_příkaz",
            "Prostor",
            new String[] { "Soused1", "Soused2" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsNOT_SET ),


        new ScenarioStep( "konec",
            "Ukončení_hry_a_gratulace.",
            "Prostor",
            new String[] { "Sousedé" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsEND )
        //V úspěsném scénáři nemusí být typ posledního příkazu tsEND
        //Hra může končit i prostým dosažením požadovaného cíle
    };


    /***************************************************************************
     * Základní chybový scénář definující reakce
     * na povinnou sadu chybových stavů.
     */
    private static final ScenarioStep[] chybový =
    {
        new ScenarioStep( "", //Název prvního příkazu musí být prázdný řetězec
            "Uvítání",
            "Prostor",
            new String[] { "Sousedé" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsSTART ),

        new ScenarioStep( "příkaz",
            "Zpráva_vypsaná_v_reakci_na_příkaz",
            "Prostor",
            new String[] { "Sousedé" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsNOT_SET ),


        new ScenarioStep( "konec",
            "Zpráva_o_předčasném_ukončení_hry.",
            "Prostor",
            new String[] { "Sousedé" },
            new String[] { "Objekty" },
            new String[] { "Batoh"   },
            tsEND )
    };


    /***************************************************************************
     * Příkazy pro demonstrační scénář sloužící k analýze funkce
     * grafického uživatelského rozhraní.
     * Scénář má za úkol projít jeméně třemi místnostmi,
     * zvednout nejméně dva objekty a položit je v jiné místnosti,
     * než ve které je zvedal.
     * Příkazy pro demonstrační scénář neobsahuje úvodní prázdný příkaz,
     * ten si konstruktor scénáře doplní sám.
     */
    String[] demonstrační = {
    //Následující příkazy jsou pouze ukázkou, jak by takový scénář mohl vypadat
             "jdi   koupelna",
             "vezmi brýle",
             "vezmi časopis",
             "jdi   předsíň",
             "jdi   obývák",
             "polož časopis",
             "polož brýle",
             "konec"
    };


    /** Jediná instance této třídy. Spravuje všechny scénáře sdružené hry. */
    private static final PrázdnýSprávceScénářůLit SS =
                                              new PrázdnýSprávceScénářůLit();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vrátí správce scénářů - jedinou instanci této třídy.
     *
     * @return Správce scénářů
     */
    public static PrázdnýSprávceScénářůLit getInstance()
    {
        return SS;
    }


    /***************************************************************************
     * Vytvoří instanci představující správce scénářů hry.
     */
    private PrázdnýSprávceScénářůLit()
    {
        super(autor, xname, TŘÍDA);

        addScenario("Základní",     TypeOfScenario.scHAPPY,    základní);
        addScenario("Chybový",      TypeOfScenario.scMISTAKES, chybový);
        addScenario("Demo for GUI", demonstrační);
        seal();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================

    /***************************************************************************
     * Základní test ověřující, 
     * jestli správce scénářů vyhovuje zadným okrajovým podmínkám, tj. jestli:
     * <ul>
     *   <li>Umí vrátit správně naformátované jméno autora/autorky hry 
     *       a jeho/její x-name.</li>
     *   <li>Definuje základní úspěšný a základní chybový scénář.</li>
     *   <li>Základní chybový scénář má následující vlastnosti:
     *     <ul>
     *       <li>Startovní příkaz, jehož název je prázdný řetězec</li>
     *       <li>Minimální požadovaný počet kroků</li>
     *       <li>Minimální počet navštívených místností</li>
     *       <li>Minimální počet "zahlédnutých" místností</li>
     *       <li>Použití příkazů pro přechod z prostoru do prostoru
     *         zvednití nějakého objektu a položení nějakého objektu</li>
     *     </ul>
     *   </li>
     *   <li>Základní chybový scénář má následující vlastnosti:
     *     <ul>
     *       <li>Startovní příkaz, jehož název je prázdný řetězec</li>
     *       <li>Použití všech povinných chybových typů kroku
     *         definovaných ve třídě {@link TypeOfStep}</li>
     *       <li>Ukončení příkazem pro nestandardní ukončení hry</li>
     *     </ul>
     *   </li>
     * </ul>
     */
    public static void testSprávceScénářů()
    {
        _Test_101 test = _Test_101.getInstance(SS);
        test.testScenarioManager();
    }


    /***************************************************************************
     * Testování funkce hry prováděné postupně
     * prostřednictvím všech scénářů daného správce
     */
    public static void prověrkaHry()
    {
        IGame     hra  = SS.getGame();
        _Test_101 test = _Test_101.getInstance(hra);
        test.testGame();
    }


    /***************************************************************************
     * Test ověřujícífunkci textovou verzi hry, 
     * jejíž scénáře daný správce spravuje.
     */
    public static void testTXT()
    {
        IGame     hra  = SS.getGame();
        _Test_101 test = _Test_101.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /***************************************************************************
     * Test demonstrující hraní hry na implicitním GUI.
     */
    public static void testGUI()
    {
        IGameG    hra  = (IGameG)SS.getGame();
        _Test_115 test = _Test_115.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )
    {
        testTXT();
    }
}
